<?php

namespace app\shop\controller;

use think\Controller;

class Cart extends Controller
{
  public function __construct()
  {
    parent::__construct();

    $this->ProductModel = model('Product.Product');
    $this->TypeModel = model('Product.Type');
    $this->CartModel = model('Product.Cart');
    $this->BusinessModel = model('Business.Business');
    $this->AddressModel = model('Business.Address');
  }

  // 购物车页面
  public function index()
  {
    // 判断是否有post请求
    if ($this->request->isPost()) {
      // 接收busid，判断用户是否存在
      $busid = $this->request->param('busid', 0, 'trim');
      // 接收购物车id（这里是因为要在结算页面返回出订单的数据）
      $ids = $this->request->param('ids', 0, 'trim');

      //先判断用户是否存在
      $business = $this->BusinessModel->find($busid);

      if (!$business) {
        $this->error('用户不存在');
        exit;
      }

      // 设置用户的条件（用来区分购物车的所有数据，和结算页面的数据）
      $where = ['busid' => $busid];

      if (!empty($ids)) {
        // in：查询某个范围内的值，因为$ids可能会传来多个值，所以这里使用in
        $where['cart.id'] = ['in', $ids];
      }

      // 查询出购物车列表的所有数据，链表查询，因为需要知道产品的信息
      $list = $this->CartModel->with(['product'])->where($where)->select();

      // 判断，返回数据回去
      if ($list) {
        $this->success('返回购物车数据', null, $list);
        exit;
      } else {
        $this->error('购物车暂无数据');
        exit;
      }
    }
  }

  // 加入购物车
  public function add()
  {
    // 判断是否有post请求
    if ($this->request->isPost()) {
      // 接收参数
      $busid = $this->request->param("busid", 0, 'trim');
      $proid = $this->request->param('proid', 0, 'trim');

      //先判断用户是否存在
      $business = $this->BusinessModel->find($busid);

      if (!$business) {
        $this->error('用户不存在');
        exit;
      }

      //先判断商品是否存在
      $product = $this->ProductModel->find($proid);

      if (!$product) {
        $this->error('商品不存在');
        exit;
      }

      // 组装条件
      $where = [
        'busid' => $busid,
        'proid' => $proid
      ];

      // 判断购物车是否有这个商品
      $cart = $this->CartModel->where($where)->find();

      // 如果有：
      if ($cart) {

        // 组装数据
        $nums = bcadd($cart['nums'], 1); // 加法
        $price = $product['price'];
        $total = bcmul($nums, $price); // 乘法

        $data = [
          'id' => $cart['id'],
          'nums' => $nums,
          'price' => $price,
          'total' => $total
        ];

        // 更新语句，更新购物车表的数量
        $result = $this->CartModel->validate('common/Product/Cart.edit')->isUpdate(true)->save($data);

        // 判断
        if ($result == FALSE) {
          $this->error($this->CartModel->getError());
          exit;
        } else {
          $this->success('更新购物车数量成功');
          exit;
        }
      }
      // 如果没有
      else {
        // 插入语句，插入到购物车表
        // 组装数据
        $data = [
          'busid' => $busid,
          'proid' => $proid,
          'nums' => 1,
          'price' => $product['price'],
          'total' => $product['price']
        ];

        // 执行插入语句
        $result = $this->CartModel->validate('common/Product/Cart')->save($data);

        // 判断
        if ($result === FALSE) {
          $this->error($this->CartModel->getError());
          exit;
        } else {
          $this->success('添加购物车成功');
          exit;
        }
      }
    }
  }

  // 编辑购物车,步进器和总价钱
  public function edit()
  {
    // 判断是否有post请求
    if ($this->request->isPost()) {
      // 接收参数
      $busid = $this->request->param('busid', 0, 'trim');
      $cartid = $this->request->param('cartid', 0, 'trim');
      $nums = $this->request->param('nums', 0, 'trim');

      //先判断用户是否存在
      $business = $this->BusinessModel->find($busid);
      if (!$business) {
        $this->error('用户不存在');
        exit;
      }

      //先判断购物车记录是否存在
      $cart = $this->CartModel->find($cartid);

      if (!$cart) {
        $this->error('购物车记录不存在');
        exit;
      }

      $product = $this->ProductModel->find($cart['proid']);

      if (!$product) {
        $this->error('商品不存在');
        exit;
      }

      if ($nums <= 0) {
        $this->error('购物车数量有误');
        exit;
      }

      // 组装数据
      $price = $product['price'];
      $total = bcmul($price, $nums);
      $data = [
        'id' => $cart['id'],
        'nums' => $nums,
        'price' => $price,
        'total' => $total
      ];

      // 执行更新语句
      $result = $this->CartModel->validate('common/Product/Cart.edit')->isUpdate(true)->save($data);

      if ($result == FALSE) {
        $this->error($this->CartModel->getError());
        exit;
      } else {
        $this->success('更新购物车数量成功');
        exit;
      }
    }
  }

  // 删除购物车某一数据
  public function del()
  {
    // 判断是否是post请求
    if ($this->request->isPost()) {
      // 接收参数
      $busid = $this->request->param('busid', 0, 'trim');
      $cartid = $this->request->param('cartid', 0, 'trim');

      //先判断用户是否存在
      $business = $this->BusinessModel->find($busid);

      if (!$business) {
        $this->error('用户不存在');
        exit;
      }

      //先判断购物车记录是否存在
      $cart = $this->CartModel->find($cartid);

      if (!$cart) {
        $this->error('购物车记录不存在');
        exit;
      }

      //执行
      $result = $this->CartModel->where(['id' => $cartid])->delete();

      if ($result == FALSE) {
        $this->error($this->CartModel->getError());
        exit;
      } else {
        $this->success('删除购物车成功');
        exit;
      }
    }
  }

  // 结算页面获取地址数据
  public function address()
  {
    // 判断是否有post请求
    if ($this->request->isPost()) {
      // 接收参数
      $busid = $this->request->param('busid', 0, 'trim');

      //先判断用户是否存在
      $business = $this->BusinessModel->find($busid);
      if (!$business) {
        $this->error('用户不存在');
        exit;
      }

      //查询当前用户的收货地址，查找是否有默认
      $address = $this->AddressModel->where(['busid' => $busid, 'status' => '1'])->find();

      // 如果没有默认，就查找全部
      if (!$address) {
        $address = $this->AddressModel->where(['busid' => $busid])->find();
      }

      // 将地址返回回去
      if ($address) {
        $this->success('返回地址数据', null, $address);
        exit;
      } else {
        $this->error('暂无收货地址');
        exit;
      }
    }
  }
}
